function defineReactive(_data, key, value) {
    Object.defineProperty(_data, key, {
      get() {
        console.log("正在获取" + key + "的值");
        return value;
      },
      set(newVal) {
        if (newVal === value) return;
  
        console.log("正在设置" + key + "的值");
        value = newVal;
      },
    });
  }

class Observe {
    constructor (_data){
        this._data = _data;


        if (Array.isArray(_data)) {
            this.observeArray(_data);
          } else {
            this.walk(_data);
          }
    }
    observeArray(_data) {
        //当现在被操作的是数组的时候,我们不能直接使用defineProperty进行操作,但是我们要对数组内部的对象进行响应式操作
        _data.forEach((item) => {
          //把数组的值交给observe函数重新开始监听
          observe(item);
        });
      }
    
      //在Observer的原型对象上封装一个对对象操作的方法
      walk(_data) {
        for (let key of Object.keys(_data)) {
          //把每一个数据的响应式核心代码交给defineReactive函数处理
          defineReactive(_data, key, _data[key]);
        }
      }
    }
    

function observe (){
    for (let key of Object.keys(_data)) {
       
        defineReactive(_data, key, _data[key]);
      }
}

function Vue(options){
    this._data = options._data

    for (let key of Object.keys(this._data)) {
        Object.defineProperty(this, key, {
          get() {
            return this._data[key];
          },
          set(newVal) {
            this._data[key] = newVal;
          },
        });
      }
}



//实例化Vue
const vm = new Vue({
    data: {
      count: 1,
      course: {
        type: "easy",
        name: "vue",
      },
    },
  });
  
  console.log(vm);